/*
 *
 *
 */

#ifndef ICOMMONDCBTRANSPORT_H_
#define ICOMMONDCBTRANSPORT_H_

#include <functional>
#include "ITransport.h"

namespace zl
{
namespace zlbase
{

/// \brief 通用开门板通信接口
///
/// 该通信接口包含了常用的开门板的接口，包含开门，查询门磁，物品状态等，
/// 接口的条用方式支持同步和异步调用
class ICommonDCBTransport : public ITransport
{
public:
    /// \brief 当前支持的协议类型
    enum class EType
    {
        Fengchao = 0x01,		///< 丰巢开门板协议，示例（02 18 1A为查询板号指令）
        Dongcheng,			    ///< 东城驱动板协议，示例（STX FL ADDR SEQ CMD LEN INFO BCC ETX)
		StandardSerial,		    ///< 标准串口开门板协议

		Unknown
    };

    virtual ~ICommonDCBTransport() = default;

    /// \brief 设置通信链路
    ///
    /// 只有当该通信接口需要直接跟硬件设备通信时，才需要设置通信链路，比如串口/网口的开门板
    /// 监控板等，当设备为第三方的外设，且是使用厂商的SDK控制硬件的，不需要设置通信链路接口
    inline void SetDatalink(std::shared_ptr<IBaseDatalink> datalink)
    {
        datalink_ = datalink;
    }

    /// \brief 获取通信链路对象
    inline std::shared_ptr<IBaseDatalink> GetDatalink()
    {
        return datalink_;
    }

    /// \brief 连接
    inline int32_t Connect() override 
    {
        return datalink_->Open();
    }

    /// \brief 断开连接
    inline int32_t Disconnect() override
    {
        return datalink_->Close();
    }

    /// \brief 打开箱门
    ///
    /// 该接口用于打开指定板号开门板上序号为index的格口
    /// \param[in] col 指定开门板的板号
    /// \param[in] index 指定格口的序号
    /// \return 错误码
    virtual int32_t OpenLocker(int32_t col, int32_t index) = 0;

    /// \brief 获取门磁状态
    ///
    /// 获取指定的开门板的门磁状态数据，其中每个字节表示一个格口的门磁状态
    /// (0x00：门关，0x01：门开）,状态值按（1-24）顺序排列
    /// \param[in] col 指定开门板的板号
    /// \param[out] status 二进制状态数据
    /// \param[out] len 状态数据长度
    /// \return 错误码
    virtual int32_t GetDoorStatus(int32_t col, unsigned char *status, size_t &len) = 0;

    /// \brief 获取物品状态
    ///
    /// 获取指定的开门板的物品状态数据，其中每个字节表示一个可口的物品状态
    /// (0x00：无物，0x01：有物)，状态值按（1-24）顺序排列
    /// \param[in] col 指定开门板的板号
    /// \param[out] status 二进制状态数据
    /// \param[out] 状态数据长度
    /// \return 错误码
    virtual int32_t GetItemStatus(int32_t col, unsigned char *status, size_t &len) = 0;

    /// \brief 获取设备版本号
    ///
    /// 获取指定开门板的固件版本号，该版本号为开门板固件的版本号
    /// \param[in] col 指定的开门板板号
    /// \param[out] version 二进制版本号数据
    /// \param[out] len 数据长度
    /// \return 错误码
    virtual int32_t GetFirmwareVersion(int32_t col, unsigned char *version, size_t &len) = 0;

protected:
    std::shared_ptr<IBaseDatalink> datalink_;
};

} // namespace zlbase
} // namespace zl

#endif // ICOMMONDCBTRANSPORT_H_
